package domain.gbshaasrode.spreadsheet;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.List;

import com.google.gdata.data.spreadsheet.ListEntry;
import com.google.gdata.data.spreadsheet.ListFeed;
import com.google.gdata.data.spreadsheet.SpreadsheetEntry;
import com.google.gdata.data.spreadsheet.WorksheetEntry;
import com.google.gdata.util.ServiceException;

import domain.DomainException;

public class GBSOpvangWorkSheetOpvang extends GBSOpvangWorkSheet {
	
	public static final double PRIJSPERHALFUUR = 1.1;

	public GBSOpvangWorkSheetOpvang(
			GBSHaasrodeSpreadSheetService service,
			GBSOpvangSpreadSheet gbsOpvangSpreadSheet) throws DomainException {
		super(service, gbsOpvangSpreadSheet);
	}

	@Override
	protected void initWorkSheet() throws DomainException{
		SpreadsheetEntry spreadsheet = getGbsOpvangSpreadSheet().getGbsHaasrodeSS();
		List<WorksheetEntry> worksheets;
		try {
			worksheets = spreadsheet.getWorksheets();
			// Iterate through each worksheet in the spreadsheet.
			for (WorksheetEntry worksheet : worksheets) {
				// Get the worksheet's title, row count, and column count.
				String title = worksheet.getTitle().getPlainText();
				if(title.equals("Opvang")){
					setWorksheet(worksheet);
				}
			}
			if(getWorksheet() == null){
				throw new DomainException("worksheet not found");
			}
		} catch (IOException | ServiceException e) {
			throw new DomainException("no worksheets available",e);
		}		
	}

	public void addRow(String llnr, String in, String dagnaam, String dag, String maand, String jaar, String uur, String minuten) throws DomainException{
		// Fetch the list feed of the worksheet.
		URL listFeedUrl = getWorksheet().getListFeedUrl();

		// Create a local representation of the new row.
		ListEntry row = new ListEntry();
		row.getCustomElements().setValueLocal("leerling", llnr);
		row.getCustomElements().setValueLocal("in", in);
		row.getCustomElements().setValueLocal("dagnaam", dagnaam);
		row.getCustomElements().setValueLocal("dag", dag);
		row.getCustomElements().setValueLocal("maand", maand);	    
		row.getCustomElements().setValueLocal("jaar", jaar);
		row.getCustomElements().setValueLocal("uur", uur);
		row.getCustomElements().setValueLocal("minuten", minuten);

		// Send the new row to the API for insertion.
		try {
			row = getGbsService().getService().insert(listFeedUrl, row);
		} catch (IOException e) {
			throw new DomainException("cannot write", e);
		} catch (ServiceException e) {
			throw new DomainException("service unavailable", e);
		}
	}

	public String toString(int nr, int maand, int jaar) throws DomainException{
		String overview = "";
		URL listFeedUrl = getWorksheet().getListFeedUrl();
		try {
			listFeedUrl = new URI(getWorksheet().getListFeedUrl().toString()
					+ "?sq=leerling=="+nr+"%20and%20maand=="+maand+"%20and%20jaar=="+jaar).toURL();
		} catch (URISyntaxException e) {
			throw new DomainException("no entries found",e);
		} catch (MalformedURLException e) {
			throw new DomainException("wrong url",e);
		}
		ListFeed listFeed;
		int totaalAantalHalveUren = 0;
		try {
			listFeed = getGbsService().getService().getFeed(listFeedUrl, ListFeed.class);		
			// Iterate through each row, printing its cell values.
			
			for (ListEntry row : listFeed.getEntries()) {
				String in = row.getCustomElements().getValue("in");				
				String dagnaam = row.getCustomElements().getValue("dagnaam");				
				String dag = row.getCustomElements().getValue("dag");				
				String month = row.getCustomElements().getValue("maand");
				String year = row.getCustomElements().getValue("jaar");
				String uur = row.getCustomElements().getValue("uur");				
				String minuten = row.getCustomElements().getValue("minuten");
				
				int tijd = Integer.parseInt(uur)*100 + Integer.parseInt(minuten);
				
				int aantalHalveUren = 0;				
				if(in.equals("in")){
					if(tijd >= 700 && tijd <= 730){
						aantalHalveUren = 3;
					} else if( tijd <= 800){
						aantalHalveUren = 2;
					} else {
						aantalHalveUren = 1;
					}
				} else { //out
					if(dagnaam.equals("maandag")){
						if(tijd >= 1630 && tijd <= 1700){
							aantalHalveUren = 1;
						} else if( tijd <= 1730){
							aantalHalveUren = 2;
						} else {
							aantalHalveUren = 3;
						}
					} else if(dagnaam.equals("woensdag")){
						if(tijd >= 1230 && tijd <= 1300){
							aantalHalveUren = 1;
						} else if( tijd <= 1330){
							aantalHalveUren = 2;
						} else if( tijd <= 1400){
							aantalHalveUren = 3;
						} else if( tijd <= 1430){
							aantalHalveUren = 4;
						} else if( tijd <= 1500){
							aantalHalveUren = 5;
						} else if( tijd <= 1530){
							aantalHalveUren = 6;
						} else if( tijd <= 1600){
							aantalHalveUren = 7;
						} else if( tijd <= 1630){
							aantalHalveUren = 8;
						} else if( tijd <= 1700){
							aantalHalveUren = 9;
						} else if( tijd <= 1730){
							aantalHalveUren = 10;
						} else {
							aantalHalveUren = 11;
						}
					} else {
						if(tijd >= 1600 && tijd <= 1630){
							aantalHalveUren = 1;
						} else if( tijd <= 1700){
							aantalHalveUren = 2;
						} else if( tijd <= 1730){
							aantalHalveUren = 3;
						} else {
							aantalHalveUren = 4;
						}
					}
				}

				totaalAantalHalveUren += aantalHalveUren;	
				
				if(in.equals("in")) in = in+" ";
				while(dagnaam.length() < 9) dagnaam = " "+dagnaam;
				if(Integer.parseInt(dag) < 10) dag = "0"+dag;
				if(Integer.parseInt(month) < 10) month = "0"+month;
				if(Integer.parseInt(uur) < 10) uur = "0"+uur;
				if(Integer.parseInt(minuten)<10) minuten="0"+minuten;

				overview += "- "+in+" "+dagnaam+"  "+dag+"/"+month+"/"+year+" "+uur+":"+minuten +" -> "+aantalHalveUren;
				overview += "\n";
			}	
		} catch (IOException | ServiceException e) {
			throw new DomainException("Something went wrong",e);
		}	   
		
		overview += "\n";
		overview += "totaal te betalen voor deze maand: "+totaalAantalHalveUren*PRIJSPERHALFUUR;
		return overview;
	}
	
	public double getTeBetalen(int nr, int maand, int jaar) throws DomainException{
		double totaalprijs = 0;
		URL listFeedUrl = getWorksheet().getListFeedUrl();
		try {
			listFeedUrl = new URI(getWorksheet().getListFeedUrl().toString()
					+ "?sq=leerling=="+nr+"%20and%20maand=="+maand+"%20and%20jaar=="+jaar).toURL();
		} catch (URISyntaxException e) {
			throw new DomainException("no entries found",e);
		} catch (MalformedURLException e) {
			throw new DomainException("wrong url",e);
		}
		ListFeed listFeed;
		int totaalAantalHalveUren = 0;
		try {
			listFeed = getGbsService().getService().getFeed(listFeedUrl, ListFeed.class);		
			// Iterate through each row, printing its cell values.
			
			for (ListEntry row : listFeed.getEntries()) {
				String in = row.getCustomElements().getValue("in");				
				String dagnaam = row.getCustomElements().getValue("dagnaam");				
				String uur = row.getCustomElements().getValue("uur");				
				String minuten = row.getCustomElements().getValue("minuten");
				
				int tijd = Integer.parseInt(uur)*100 + Integer.parseInt(minuten);
				
				int aantalHalveUren = 0;				
				if(in.equals("in")){
					if(tijd >= 700 && tijd <= 730){
						aantalHalveUren = 3;
					} else if( tijd <= 800){
						aantalHalveUren = 2;
					} else {
						aantalHalveUren = 1;
					}
				} else { //out
					if(dagnaam.equals("maandag")){
						if(tijd >= 1630 && tijd <= 1700){
							aantalHalveUren = 1;
						} else if( tijd <= 1730){
							aantalHalveUren = 2;
						} else {
							aantalHalveUren = 3;
						}
					} else if(dagnaam.equals("woensdag")){
						if(tijd >= 1230 && tijd <= 1300){
							aantalHalveUren = 1;
						} else if( tijd <= 1330){
							aantalHalveUren = 2;
						} else if( tijd <= 1400){
							aantalHalveUren = 3;
						} else if( tijd <= 1430){
							aantalHalveUren = 4;
						} else if( tijd <= 1500){
							aantalHalveUren = 5;
						} else if( tijd <= 1530){
							aantalHalveUren = 6;
						} else if( tijd <= 1600){
							aantalHalveUren = 7;
						} else if( tijd <= 1630){
							aantalHalveUren = 8;
						} else if( tijd <= 1700){
							aantalHalveUren = 9;
						} else if( tijd <= 1730){
							aantalHalveUren = 10;
						} else {
							aantalHalveUren = 11;
						}
					} else {
						if(tijd >= 1600 && tijd <= 1630){
							aantalHalveUren = 1;
						} else if( tijd <= 1700){
							aantalHalveUren = 2;
						} else if( tijd <= 1730){
							aantalHalveUren = 3;
						} else {
							aantalHalveUren = 4;
						}
					}
				}

				totaalAantalHalveUren += aantalHalveUren;	
			}	
		} catch (IOException | ServiceException e) {
			throw new DomainException("Something went wrong",e);
		}	   
		
		totaalprijs = totaalAantalHalveUren*PRIJSPERHALFUUR;
		return totaalprijs;
	}

}
